Przykad 6.9. Realizacja algorytmu Prima z kopcem binarnym
/**
 * Dla danego grafu nieskierowanego oblicz MST, zaczynajc od losowo
 * wybranego wierzchoka. Kodowanie MST odbywa si w tablicy 'pred'.
 */
void mst_prim (Graph const &graph, vector<int> &pred) {
   // Zainicjuj tablice pred[] i key[]. Zacznij od dowolnego
   // wierzchoka s=0. Kolejka priorytetowa PQ zawiera wszystkie v z G
   const int n = graph.numVertices();
   pred.assign(n, -1);
   vector<int> key(n, numeric_limits<int>::max());
   key[0] = 0;
   BinaryHeap pq(n);
   vector<bool> inQueue(n, true);
   for (int v = 0; v < n; v++) {
      pq.insert(v, key[v]);
   }

   while (!pq.isEmpty()) {
      int u = pq.smallest();
      inQueue[u] = false;

      // Przetwrz wszystkich ssiadw u, aby sprawdzi, czy ktra
      // z krawdzi nie skraca najlepszej odlegoci
      for (VertexList::const_iterator ci = graph.begin(u);
           ci != graph.end(u); ++ci) {
         int v = ci->first;
         if (inQueue[v]) {
            int w = ci->second;
            if (w < key[v]) {
               pred[v] = u;
               key[v] = w;
               pq.decreaseKey(v, w);
            }
         }
      }
   }
}
